﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Clinica_Frba
{
    public partial class Profesional : Form
    {
        public const char Alta = 'A';
        public const char Baja = 'B';
        public const char Edit = 'E';
        public const char Display = 'D';
        public char accion;
        private Conexion sqlCon = Conexion.getInstance();
        private Utility util = Utility.getInstance();
        public int idSelectedMedico;

        public Profesional()
        {
            InitializeComponent();
        }

        private void Profesional_Load(object sender, EventArgs e)
        {
            // Cargar especialidades
            loadEspecialidades();

            if (accion == Profesional.Alta)
            {
                fechaNacimiento.Format = DateTimePickerFormat.Custom;
                fechaNacimiento.CustomFormat = " ";
                userLabel.Visible = false;
                user.Visible = false;
            }
            else
            {   // Llenar form con los datos del medico seleccionado
                loadFormData();

                if (accion == Profesional.Edit)
                    setEspecialidadesMed();
                else
                    setFormReadOnly();
            }
        }

        private void setEspecialidadesMed()
        {
            SqlDataReader reader;
            string select;
            int i;

            select = "SELECT es.Cod_Especialidad" +
                         " FROM b_sharp.Especialidades es " +
                         " JOIN b_sharp.EspecialidadMedico em ON es.Cod_Especialidad = em.Cod_Especialidad " +
                         " WHERE id_medico = " + idSelectedMedico + ";";

            reader = sqlCon.execQuery(select);

            while (reader.Read())
            {
                for (i = 0; i < especialidades.Items.Count; i++)
                {
                    Object item = especialidades.Items[i];

                    DataRowView row = item as DataRowView;
                    if ((decimal)row[0] == reader.GetDecimal(0))
                        especialidades.SetItemCheckState(i, CheckState.Checked);

                }
            }
        }

        private void setFormReadOnly()
        {
            medicoNombre.ReadOnly = true;
            medicoApe.ReadOnly = true;
            nroDoc.ReadOnly = true;
            tipoDoc.Enabled = false;
            direccion.ReadOnly = true;
            telefono.ReadOnly = true;
            mail.ReadOnly = true;
            fechaNacimiento.Enabled = false;
            sexo.Enabled = false;
            matricula.ReadOnly = true;
            user.ReadOnly = true;
            grabar.Visible = false;
            limpiar.Visible = false;

            // Convertir checked list box en un list box comun    
            espListBox.DataSource = especialidades.DataSource;
            espListBox.DisplayMember = especialidades.DisplayMember;
            espListBox.ValueMember = especialidades.ValueMember;

            this.groupBox3.Controls.Remove(especialidades);
            this.groupBox3.Controls.Add(espListBox);
        }

        private void loadFormData()
        {
            SqlDataReader reader;

            reader = sqlCon.execQuery("SELECT Medico_Nombre, Medico_Apellido, Medico_Num_Doc, Medico_Tipo_Doc, Medico_Direccion, Medico_Telefono, Medico_Mail, Medico_Fecha_Nac, isnull(Medico_Sexo,''), isnull(Medico_Matricula,0), isnull(id_usuario,'') FROM b_sharp.Medicos " + 
                                      " WHERE id_medico = " + idSelectedMedico + ";");

            if (reader.Read())
            {
                medicoNombre.Text = reader.GetString(0);
                medicoApe.Text = reader.GetString(1);
                nroDoc.Text = Convert.ToString(reader.GetDecimal(2));
                tipoDoc.SelectedText = reader.GetString(3);
                direccion.Text = reader.GetString(4);
                telefono.Text = Convert.ToString(reader.GetDecimal(5));
                mail.Text = reader.GetString(6);
                fechaNacimiento.Value = reader.GetDateTime(7);
                sexo.SelectedText = reader.GetString(8);
                matricula.Text = Convert.ToString(reader.GetDecimal(9));
                user.Text = Convert.ToString(reader.GetString(10));
            }
        }

        private void loadEspecialidades()
        {
            string select;
            SqlDataAdapter adapter;
            DataTable table = new DataTable();

            if (accion != Profesional.Display)
                select = "SELECT Cod_Especialidad, Esp_Descripcion FROM b_sharp.Especialidades;";
            else
                select = "SELECT es.Cod_Especialidad, Esp_Descripcion " +
                         " FROM b_sharp.Especialidades es " +
                         " JOIN b_sharp.EspecialidadMedico em ON es.Cod_Especialidad = em.Cod_Especialidad " +
                         " WHERE id_medico = " + idSelectedMedico + ";";

            //Llenar especialidades
            adapter = sqlCon.execQueryGrid(select);
            adapter.Fill(table);

            especialidades.DataSource = table;
            especialidades.DisplayMember = "Esp_Descripcion";
            especialidades.ValueMember = "Cod_Especialidad";
        }

        private void fechaValueChanged(object sender, EventArgs e)
        {
            fechaNacimiento.Format = DateTimePickerFormat.Short;
        }

        private void grabar_Click(object sender, EventArgs e)
        {
            try
            {
                if (!checkCamposObligatorios())
                    return;

                if (!checkNumericFields())
                    return;

                if (accion == Profesional.Alta)
                    insertProfesional();
                else if (accion == Profesional.Edit)
                    updateProfesional();

                MessageBox.Show("Los datos fueron grabados correctamente", "Profesional");

                this.Close();
            }
            catch (Exception) {
                MessageBox.Show("Error al guardar los datos, intente nuevamente", "Profesional");
            }
        }

        private bool checkNumericFields()
        {
            string message = "";

            if (!util.isNumber(nroDoc.Text))
                message += "El numero de documento es incorrecto\n";

            if (!util.isNumber(telefono.Text))
                message += "Introduzca solo numeros en el campo Telefono \n";

            if (!util.isNumber(matricula.Text))
                message += "El numero de matricula es incorrecto\n";

            if (message.Length > 0)
            {
                MessageBox.Show(message, "Mensajes de Error");
                return false;
            }

            return true;
        }

        private void insertProfesional()
        {
            string insert;
            SqlCommand cmd;
            int id_medico;

            // Inserta nuevo profesional con los datos seleccionados
            insert = "INSERT INTO b_sharp.Medicos (Medico_Nombre, Medico_Apellido, Medico_Num_Doc, Medico_Tipo_Doc, Medico_Direccion, Medico_Telefono, Medico_Mail, Medico_Fecha_Nac, Medico_Sexo, Medico_Matricula) " + 
                     " VALUES (@nombre,@apellido,@numDoc,@tipoDoc,@direccion,@tel,@mail,@fechaNac,@sexo,@matricula);" + 
                     "SELECT CAST(SCOPE_IDENTITY() AS int);";

            cmd = new SqlCommand(insert, sqlCon.openCon());
            cmd.Parameters.AddWithValue("@nombre",medicoNombre.Text);
            cmd.Parameters.AddWithValue("@apellido",medicoApe.Text);
            cmd.Parameters.AddWithValue("@numDoc",Convert.ToDecimal(nroDoc.Text));
            cmd.Parameters.AddWithValue("@tipoDoc",tipoDoc.SelectedItem);
            cmd.Parameters.AddWithValue("@direccion",direccion.Text);
            cmd.Parameters.AddWithValue("@tel", Convert.ToDecimal(telefono.Text));
            cmd.Parameters.AddWithValue("@mail",mail.Text);
            cmd.Parameters.AddWithValue("@fechaNAc", Convert.ToDateTime(this.fechaNacimiento.Text));
            cmd.Parameters.AddWithValue("@sexo", sexo.Text);
            cmd.Parameters.AddWithValue("@matricula", Convert.ToDecimal(matricula.Text));

            // Inserta profesional y devuelve el id
            id_medico = (Int32)cmd.ExecuteScalar();

            // Inserta las especialidades del profesional
            insertEspecialidades(id_medico);
        }

        private void updateProfesional()
        {
            string update;
            SqlCommand cmd;

            //Eliminamos entradas viejas de especialidades
            update = "DELETE b_sharp.EspecialidadMedico WHERE id_medico = @idMed; ";

            //Actualizamos nombre de rol
            update += "UPDATE b_sharp.Medicos " +
                      "SET Medico_Nombre = @nombre, " + 
                      "    Medico_Apellido = @apellido, " +
                      "    Medico_Num_Doc = @numDoc, " +
                      "    Medico_Tipo_Doc = @tipoDoc, " +
                      "    Medico_Direccion = @direccion, " +
                      "    Medico_Telefono = @tel, " +
                      "    Medico_Mail = @mail, " +
                      "    Medico_Fecha_Nac = @fechaNAc, " +
                      "    Medico_Sexo = @sexo, " +
                      "    Medico_Matricula = @matricula " +
                      "WHERE id_medico = @idMed; ";

            cmd = new SqlCommand(update, sqlCon.openCon());
            cmd.Parameters.AddWithValue("@idMed", idSelectedMedico);
            cmd.Parameters.AddWithValue("@nombre", medicoNombre.Text);
            cmd.Parameters.AddWithValue("@apellido", medicoApe.Text);
            cmd.Parameters.AddWithValue("@numDoc", Convert.ToDecimal(nroDoc.Text));
            cmd.Parameters.AddWithValue("@tipoDoc", tipoDoc.Text);
            cmd.Parameters.AddWithValue("@direccion", direccion.Text);
            cmd.Parameters.AddWithValue("@tel", Convert.ToDecimal(telefono.Text));
            cmd.Parameters.AddWithValue("@mail", mail.Text);
            cmd.Parameters.AddWithValue("@fechaNAc", Convert.ToDateTime(this.fechaNacimiento.Text));
            cmd.Parameters.AddWithValue("@sexo", sexo.Text);
            cmd.Parameters.AddWithValue("@matricula", Convert.ToDecimal(matricula.Text));
            cmd.ExecuteNonQuery();

            //Insertamos entradas nuevas
            insertEspecialidades(idSelectedMedico);

        }

        private void insertEspecialidades(int id_medico)
        {
            decimal idEsp;
            SqlCommand command;

            foreach(DataRowView item in especialidades.CheckedItems)
            {   // Get id especialidad
                idEsp = (decimal)item.Row[0];

                // Insert especialidad
                command = new SqlCommand("INSERT INTO b_sharp.EspecialidadMedico (id_medico, Cod_Especialidad) VALUES (@idMed,@idEsp);", sqlCon.openCon());
                command.Parameters.AddWithValue("@idMed", id_medico);
                command.Parameters.AddWithValue("@idEsp", idEsp);

                command.ExecuteNonQuery();
            }
        }

        private bool checkCamposObligatorios()
        {
            string message = "";

            if (medicoNombre.Text.Length == 0)
                message = "Complete el Nombre\n";

            if (medicoApe.Text.Length == 0)
                message += "Complete el Apellido\n";

            if (fechaNacimiento.Format != DateTimePickerFormat.Short)
                message += "Complete la Fecha de Nacimiento\n";

            if (tipoDoc.SelectedIndex == 0)
                message += "Seleccione un Tipo de Documento\n";

            if (nroDoc.Text.Length == 0)
                message += "Complete el Numero de Documento\n";

            if (sexo.SelectedIndex == 0)
                message += "Complete el Sexo\n";

            if (especialidades.CheckedItems.Count == 0)
                message += "Seleccione al menos una Especialidad\n";

            if (telefono.Text.Length == 0)
                message += "Ingrese un Numero de Telefono\n";

            if (matricula.Text.Length == 0)
                message += "La Matricula es obligatoria\n";

            if (message.Length > 0)
            {
                MessageBox.Show(message, "Mensajes de Error");
                return false;
            }

            return true;
        }

        private void limpiar_Click(object sender, EventArgs e)
        {
            //Limpiar especialidades
            especialidades.ClearSelected();
            for (int i = 0; i < especialidades.Items.Count; i++)
            {
                especialidades.SetItemChecked(i, false);
            }
            //Limpiar fecha
            fechaNacimiento.Format = DateTimePickerFormat.Custom;
            fechaNacimiento.CustomFormat = " ";

            //Limpiar filtros
            foreach (Control control in this.Controls)
            {
                if (control.GetType().ToString() == "System.Windows.Forms.GroupBox")
                    foreach (Control ctrl in ((System.Windows.Forms.GroupBox)control).Controls)
                    {
                        if ((ctrl.GetType().ToString() == "System.Windows.Forms.ComboBox") | (ctrl.GetType().ToString() == "System.Windows.Forms.TextBox"))
                        {
                            ctrl.ResetText();
                        }
                    }
            }
        }
    }
}
